package com.ying.tests.CCCbasis;

import lombok.Builder;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.stream.Collectors;

@Slf4j
public class Test1ArrayList {

    public static void main(String[] args) {
        List<Student> list = new ArrayList(){{
            add(Student.builder().id("2").name("小B").build());
            add(Student.builder().id("1").name("小A").build());
            add(Student.builder().id("3").name("小C").build());
        }};
        System.out.println(list.toString());

//        test1(list);                                        // toArray()
//        test2(list);                                        // sort()
//        ArrayList<Student> objects = new ArrayList<>();
//        test3(objects);                                     // ensureCapacity()，指定容量大小
//        test4(list, objects);                               // retainAll()，取交集
//        test5(objects);                                     // trimToSize()，删除未分配空间并更改ArrayList容量
//        test6(list);                                        // replaceAll()，替换
        test7(list);                                        // removeIf()，删除满足条件的元素

    }

    // toArray()
    private static void test1(List<Student> list) {
        log.info("---------------------list转为数组-------");
        Student[] students1 = list.toArray(new Student[list.size()]);
        Arrays.stream(students1).forEach(s -> System.out.println(s));
    }

    // sort()
    private static void test2(List<Student> list) {
        log.info("---------------------list排序-------");
        list.sort(Comparator.comparing(Student::getId));
        list.sort(Comparator.comparing(Student::getId).reversed());
        System.out.println(list.toString());

        List<Student> collect = new ArrayList<>();
        collect = list.stream().sorted(Comparator.comparing(Student::getId)).collect(Collectors.toList());
        collect = list.stream().sorted(Comparator.comparing(Student::getId).reversed()).collect(Collectors.toList());
        System.out.println(collect);
    }

    // ensureCapacity()，指定容量大小
    private static void test3(ArrayList<Student> objects) {
        log.info("---------------------list指定容量大小-------");
        objects.ensureCapacity(3);
        objects.add(Student.builder().id("1").name("小AA").build());
        objects.add(Student.builder().id("2").name("小B").build());
        objects.add(Student.builder().id("3").name("小C").build());
        // 如果我们使用 ensureCapacity() 方法来调整 arraylist 的大小，
        // 那么 arraylist 将会马上调整为指定的容量大小。
        // 否则，每次添加元素时都会调整 arraylist 的大小
        objects.add(Student.builder().id("4").name("小D").build());
        System.out.println(objects.toString());
    }

    // retainAll()，取交集
    private static void test4(List<Student> list, ArrayList<Student> objects) {
        log.info("---------------------list取交集(HashSet也能用)-------");
        list.retainAll(objects);
        System.out.println(list);
    }

    // trimToSize()
    private static void test5(ArrayList<Student> objects) {
        objects.trimToSize();
        System.out.println(objects.size());
        // 数组被存满就会创建一个新数组，扩容1.5倍，所有元素会移至新数组中，该方法可以删除未分配完的空间
    }

    // replaceAll()，替换
    private static void test6(List<Student> list) {
        list.replaceAll(l -> Student.builder().id("2").name("小B").build());
        System.out.println(list);
    }

    // removeIf()，删除满足条件的元素
    private static void test7(List<Student> list) {
        list.removeIf(l -> "2".equals(l.getId()));
        System.out.println(list);
    }



}

@Data
@Builder
@ToString
class Student {
    private String id;
    private String name;
}
